package com.demo.api;

import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.config.script.ScriptJobConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import com.demo.api.dataflow.MyDataflowJob;
import com.demo.api.simple.MySimpleJob;

/**
 * Hello world!
 */
public class App {
  public static void main(String[] args) {
    System.out.println("Hello World!");
    //参数：1、注册中心。2、job配置。
    new JobScheduler(zkCenter(), simpleJobConfiguration()).init();
//    new JobScheduler(zkCenter(), dataflowJobConfiguration()).init();
//    new JobScheduler(zkCenter(), scriptJobConfiguration()).init();
  }

  /**
   * zookeeper注册中心
   *
   * @return
   */
  public static CoordinatorRegistryCenter zkCenter() {
    //参数：1、注册中心地址，如果是多个用逗号隔开。2、命名空间
    ZookeeperConfiguration zc = new ZookeeperConfiguration("localhost:2181",
        "job-api");
    ZookeeperRegistryCenter crc = new ZookeeperRegistryCenter(zc);
    //注册中心初始化
    crc.init();
    return crc;
  }


  /**
   * simpleJob配置
   *
   * @return
   */
  public static LiteJobConfiguration simpleJobConfiguration() {
    //定义job核心配置
    JobCoreConfiguration jcc = JobCoreConfiguration
        // 参数：1、任务名称。2、定时策略。3、分片总数
        .newBuilder("mySimpleJob-api", "0/5 * * * * ?", 2)
        .build();
    //job类型配置，参数：1、核心配置。2、类的全包名
    SimpleJobConfiguration jtc = new SimpleJobConfiguration(jcc,
        MySimpleJob.class.getCanonicalName());
    //job根配置（LiteJobConfiguration），参数：1、类型配置。
    LiteJobConfiguration ljc = LiteJobConfiguration
        .newBuilder(jtc)
        // 特别注意：每次启动会覆盖掉注册中心的配置，比如修改了cron，如果不设置overwrite(true)，修改newBuilder配置不会生效
        .overwrite(true)
        .build();

    return ljc;
  }

  /**
   * dataflowJob配置
   *
   * @return
   */
  public static LiteJobConfiguration dataflowJobConfiguration() {
    JobCoreConfiguration jcc = JobCoreConfiguration
        .newBuilder("myDataflowJob-api", "0/5 * * * * ?", 2)
        .build();
    //job类型配置，参数：1、核心配置。2、类的全包名。3、是否开启流式任务，如果是false，那么数据抓取和处理都只会执行一次，不会循环
    DataflowJobConfiguration jtc = new DataflowJobConfiguration(jcc,
        MyDataflowJob.class.getCanonicalName(), true);

    LiteJobConfiguration ljc = LiteJobConfiguration
        .newBuilder(jtc)
        .overwrite(true)
        .build();
    return ljc;
  }

  /**
   * scriptJob配置
   *
   * @return
   */
  public static LiteJobConfiguration scriptJobConfiguration() {
    JobCoreConfiguration jcc = JobCoreConfiguration
        .newBuilder("myScriptJob-api", "0/5 * * * * ?", 2)
        .misfire(false)
        .build();
    //job类型配置，参数：1、核心配置。2、脚本的命令行
    //如果是windows系统则用cmd脚本，脚本中%1是windows批处理文件中的写法接收参数
    ScriptJobConfiguration jtc = new ScriptJobConfiguration(jcc, "/Users/wangfengchen/Downloads/test.sh");
    LiteJobConfiguration ljc = LiteJobConfiguration
        .newBuilder(jtc)
        .overwrite(true)
        .build();
    return ljc;
  }


}
